from numpy import *
import os
from . import utilities as utils

def getPoints():
    """坐标点位置和该坐标点所属类别

    Returns
    points:
        坐标点
    labels:
        坐标点相应的类别
    """

    points = array([[1.0,1.1], [1.0,1.0], [0,0], [0,0.1]])
    labels = ['A','A','B','B']
    return points, labels

def get_dating_persons():
    '''获取约会数据，位于res/dating.txt中
    格式：(每年飞行里程数, 游戏时间, 冰淇淋消耗量, 约会对象可能性)
    来源：《Machine Learning in Action》第二章

    returns
    -------
    (props, labels)
    '''
    return utils.load_sample_file(os.path.join(os.path.dirname(__file__), 'res', 'dating_persons.txt'))

def get_handwriting_digits():
    '''获取手写数字的数据，位于res/handwriting_digits.zip
    文件格式：32*32的0/1阵，文件名x_y_zzz.txt，其中x表示0/1阵代表的数字

    Returns
    -------
    props: [[]]
        1024长度的0/1数据，等于32*32的0/1阵
    labels:
        相应的数字
    '''

    import zipfile
    path = os.path.join(os.path.dirname(__file__), 'res', 'handwriting_digits.zip')    
    z = zipfile.ZipFile(path, 'r')

    (props, labels) = ([], [])

    for n in z.namelist():
        labels.append(n.split('_')[0])

        with z.open(n) as f:
            props.append([line[i]-ord('0') for line in f for i in range(32)])
    
    return props, labels

def get_lenses():
    return utils.loadSampleFile0(os.path.join(os.path.dirname(__file__), 'res', 'ch03_lenses.txt'))


def get_fishes():
    """鱼特征数据，用于决策树算法测试

    Returns
    -------
    features:
        鱼特征数据，1和0表示满足和不满足特征，yes和no为是否为鱼。
    featureLabels:
        特征的名称，“浮出水面不能生存”和“是否有脚蹼”。
    """
    
    props = [['no surfacing', 'flippers'],
               ['no surfacing', 'flippers'],
               ['no surfacing', 'no flippers'],
               ['surfacing', 'flippers'],
               ['surfacing', 'flippers']]
    labels = [ 'fish', 'fish', 'no fish', 'no fish', 'no fish']
    return props, labels

def abusiveTexts():
    """侮辱性的文字，用于朴素贝叶斯法

    Returns
    -------
    texts:
        几组文字，每组分解成若干单词
    types:
        每组文字是否带侮辱性的判断，0和1分别表示不带和带侮辱性
    """

    texts = [['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],
             ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
             ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],
             ['stop', 'posting', 'stupid', 'worthless', 'garbage'],
             ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
             ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]
    types = [0, 1, 0, 1, 0, 1]
    return texts, types

def _get_points_set():
    return utils.load_sample_file(os.path.join(os.path.dirname(__file__), 'res', 'points_set.txt'))

def _get_ellipse_points():
    '''获取一个椭圆形区域内的点集，只有数据没有标签，用于PCA测试'''
    return utils.load_table_file(os.path.join(os.path.dirname(__file__), 'res', 'ellipse_points.txt'))

def _get_3_ellipse_points():
    '''获取三个椭圆区域的点集数据，用于PCA测试'''

    return utils.load_table_file(os.path.join(os.path.dirname(__file__), 'res', '3_ellipse_points.txt'))

def _get_secom():
    '''半导体属性数据，属性冗余，数据用于测试PCA方法
    http://archive.ics.uci.edu/ml/datasets/SECOM
    '''
    return utils.load_table_file(os.path.join(os.path.dirname(__file__), 'res', 'secom.data'))

_name_to_func = [
        ("points_set", _get_points_set),
        ("ellipse_points", _get_ellipse_points),
        ("3_ellipse_points", _get_3_ellipse_points),
        ("secom", _get_secom),
        ("2d_points_0", lambda : _get_2d_points(0)),
        ("2d_points_1", lambda : _get_2d_points(1))

    ]

def _get_2d_points(n):
    return utils.load_table_file(os.path.join(os.path.dirname(__file__), 'res', "".join(["2d_points_", str(n), ".txt"])))

def get_sample(name):
    for item in _name_to_func:
        if name == item[0]:
            return item[1]()
    else:
        return None

